"""
逻辑运算符
学习目标：
1. 掌握and、or、not三种逻辑运算符
2. 理解逻辑运算的短路特性
3. 学会在复杂条件判断中使用逻辑运算符
"""

# ==================== 1. 逻辑运算符基础 ====================
print("=" * 50)
print("1. 三种逻辑运算符")
print("=" * 50)

# and（与）：所有条件都为True时才返回True
print("【逻辑与 and】")
print(f"True and True = {True and True}")      # True
print(f"True and False = {True and False}")    # False
print(f"False and True = {False and True}")    # False
print(f"False and False = {False and False}")  # False
print("结论：只有两边都是True，结果才是True")

print()

# or（或）：至少一个条件为True时就返回True
print("【逻辑或 or】")
print(f"True or True = {True or True}")      # True
print(f"True or False = {True or False}")    # True
print(f"False or True = {False or True}")    # True
print(f"False or False = {False or False}")  # False
print("结论：只要有一个是True，结果就是True")

print()

# not（非）：取反
print("【逻辑非 not】")
print(f"not True = {not True}")    # False
print(f"not False = {not False}")  # True
print("结论：True变False，False变True")

print()

# ==================== 2. 逻辑运算符的优先级 ====================
print("=" * 50)
print("2. 逻辑运算符的优先级")
print("=" * 50)

# 优先级：not > and > or
print("优先级：not > and > or")
print()

# 示例1：not优先于and
result = not True and False
print(f"not True and False = {result}")
print("解析：先计算 not True = False，再计算 False and False = False")

# 示例2：and优先于or
result = True or False and False
print(f"\nTrue or False and False = {result}")
print("解析：先计算 False and False = False，再计算 True or False = True")

# 示例3：使用括号改变优先级
result1 = True or (False and False)
result2 = (True or False) and False
print(f"\nTrue or (False and False) = {result1}")
print(f"(True or False) and False = {result2}")
print("💡 建议：复杂表达式使用括号，提高代码可读性")

print()

# ==================== 3. 逻辑运算符与比较运算符结合 ====================
print("=" * 50)
print("3. 逻辑运算符与比较运算符结合")
print("=" * 50)

age = 25
score = 85

# and：同时满足多个条件
print(f"年龄：{age}，成绩：{score}")
print(f"是否成年且成绩优秀（age >= 18 and score >= 90）：{age >= 18 and score >= 90}")
print(f"是否成年且成绩及格（age >= 18 and score >= 60）：{age >= 18 and score >= 60}")

print()

# or：满足任一条件
print(f"是否未成年或成绩不及格（age < 18 or score < 60）：{age < 18 or score < 60}")
print(f"是否成年或成绩优秀（age >= 18 or score >= 90）：{age >= 18 or score >= 90}")

print()

# not：条件取反
print(f"是否不是成年人（not age >= 18）：{not age >= 18}")
print(f"是否成绩不及格（not score >= 60）：{not score >= 60}")

print()

# ==================== 4. 短路特性 ====================
print("=" * 50)
print("4. 逻辑运算符的短路特性")
print("=" * 50)

print("【and的短路】")
print("如果第一个条件为False，就不会计算第二个条件")

# 模拟短路
x = 0
# 下面的表达式中，x == 0 为True，所以会继续计算后面的
# 但如果x != 0，则整个表达式直接为False，不会执行除法
if x != 0 and 10 / x > 2:  # 避免除零错误
    print("满足条件")
else:
    print("不满足条件（避免了除零错误）")

print()

print("【or的短路】")
print("如果第一个条件为True，就不会计算第二个条件")

has_permission = True
if has_permission or age >= 18:
    print("允许访问（因为has_permission为True，不再检查年龄）")

print()

# ==================== 5. 实战：用户登录验证 ====================
print("=" * 50)
print("5. 实战：用户登录验证")
print("=" * 50)

username = "admin"
password = "123456"
is_active = True

correct_username = "admin"
correct_password = "123456"

print(f"用户名：{username}")
print(f"密码：{'*' * len(password)}")
print(f"账号状态：{'激活' if is_active else '冻结'}")
print()

# 登录验证（需要同时满足三个条件）
if username == correct_username and password == correct_password and is_active:
    print("✅ 登录成功！")
else:
    print("❌ 登录失败！")
    # 详细错误提示
    if username != correct_username:
        print("  - 用户名错误")
    if password != correct_password:
        print("  - 密码错误")
    if not is_active:
        print("  - 账号已被冻结")

print()

# ==================== 6. 实战：会员权益判断 ====================
print("=" * 50)
print("6. 实战：会员权益判断")
print("=" * 50)

is_vip = True
points = 800
purchase_amount = 150

print(f"VIP会员：{is_vip}")
print(f"积分：{points}")
print(f"本次消费：¥{purchase_amount}")
print()

# 免邮条件：VIP会员 或 消费满100 或 积分大于500
free_shipping = is_vip or purchase_amount >= 100 or points > 500

if free_shipping:
    print("🎉 恭喜！享受免邮服务")
    # 显示具体原因
    reasons = []
    if is_vip:
        reasons.append("VIP会员")
    if purchase_amount >= 100:
        reasons.append("消费满100")
    if points > 500:
        reasons.append("积分超过500")
    print(f"   原因：{' / '.join(reasons)}")
else:
    print("💰 需要支付运费")

print()

# 额外折扣：必须是VIP且积分>1000
extra_discount = is_vip and points > 1000
print(f"额外折扣（VIP且积分>1000）：{extra_discount}")

print()

# ==================== 7. 实战：考试资格审核 ====================
print("=" * 50)
print("7. 实战：考试资格审核")
print("=" * 50)

student_name = "李明"
age = 17
has_id = True
paid_fee = True
score = 75

print(f"学生姓名：{student_name}")
print(f"年龄：{age}")
print(f"有证件：{has_id}")
print(f"已缴费：{paid_fee}")
print(f"平时成绩：{score}")
print()

# 资格审核
print("【资格审核】")

# 基本条件：年龄>=16 且 有证件 且 已缴费
basic_qualified = age >= 16 and has_id and paid_fee
print(f"1. 基本条件（年龄>=16 且 有证件 且 已缴费）：{basic_qualified}")

# 成绩要求：平时成绩>=60 或 是补考生
is_makeup = False  # 是否补考生
score_qualified = score >= 60 or is_makeup
print(f"2. 成绩条件（成绩>=60 或 补考生）：{score_qualified}")

# 最终资格：基本条件 且 成绩条件
final_qualified = basic_qualified and score_qualified
print(f"\n最终结果：{final_qualified}")

if final_qualified:
    print("✅ 允许参加考试")
else:
    print("❌ 不符合考试资格")
    if not basic_qualified:
        print("  - 不满足基本条件")
    if not score_qualified:
        print("  - 不满足成绩要求")

print()

# ==================== 8. 实战：年龄范围判断 ====================
print("=" * 50)
print("8. 实战：年龄范围与权限判断")
print("=" * 50)

age = 16

print(f"年龄：{age}岁")
print()

# 方法1：使用and
can_watch_pg13_v1 = age >= 13 and age < 18
print(f"可以观看PG-13电影（13-17岁）方法1：{can_watch_pg13_v1}")

# 方法2：使用链式比较（更简洁）
can_watch_pg13_v2 = 13 <= age < 18
print(f"可以观看PG-13电影（13-17岁）方法2：{can_watch_pg13_v2}")

print()

# 各种年龄限制
print("【年龄权限】")
print(f"儿童（<12岁）：{age < 12}")
print(f"青少年（12-17岁）：{12 <= age < 18}")
print(f"成年人（>=18岁）：{age >= 18}")
print(f"未成年（<18岁）：{age < 18}")
print(f"法定驾驶年龄（>=18岁）：{age >= 18}")
print(f"法定饮酒年龄（>=18岁）：{age >= 18}")

print()

# ==================== 9. 实战：时间段判断 ====================
print("=" * 50)
print("9. 实战：营业时间判断")
print("=" * 50)

hour = 14  # 当前时间14点

print(f"当前时间：{hour}:00")
print()

# 营业时间判断
is_open = (9 <= hour < 12) or (13 <= hour < 22)
print(f"是否营业中：{is_open}")

# 详细判断
if 9 <= hour < 12:
    print("  状态：上午营业时间")
elif 12 <= hour < 13:
    print("  状态：午休时间")
elif 13 <= hour < 22:
    print("  状态：下午营业时间")
else:
    print("  状态：休息时间")

print()

# 特殊时段判断
print("【特殊时段】")
is_breakfast = 7 <= hour < 10
is_lunch = 11 <= hour < 14
is_dinner = 17 <= hour < 20
is_midnight = hour >= 22 or hour < 6

print(f"早餐时间（7-10点）：{is_breakfast}")
print(f"午餐时间（11-14点）：{is_lunch}")
print(f"晚餐时间（17-20点）：{is_dinner}")
print(f"深夜时段（22-6点）：{is_midnight}")

print()

# ==================== 10. 实战：复杂条件组合 ====================
print("=" * 50)
print("10. 实战：购物折扣系统")
print("=" * 50)

is_member = True
purchase_amount = 350
is_weekend = True
has_coupon = False

print(f"会员身份：{is_member}")
print(f"购物金额：¥{purchase_amount}")
print(f"是否周末：{is_weekend}")
print(f"有优惠券：{has_coupon}")
print()

# 折扣规则：
# 1. 会员 且 消费>300：9折
# 2. 周末 且 消费>200：9.5折
# 3. 有优惠券：额外减50
# 4. 非会员 且 消费>500：9.5折

discount = 1.0  # 默认无折扣

if is_member and purchase_amount > 300:
    discount = 0.9
    print("✅ 会员折扣：9折")
elif is_weekend and purchase_amount > 200:
    discount = 0.95
    print("✅ 周末折扣：9.5折")
elif not is_member and purchase_amount > 500:
    discount = 0.95
    print("✅ 大额消费折扣：9.5折")
else:
    print("📌 无折扣")

# 计算价格
final_price = purchase_amount * discount

if has_coupon:
    final_price -= 50
    print("✅ 使用优惠券：-¥50")

print(f"\n原价：¥{purchase_amount}")
print(f"实付：¥{final_price:.2f}")
print(f"节省：¥{purchase_amount - final_price:.2f}")

print()

# ==================== 11. 综合实战：学生奖学金评定 ====================
print("=" * 50)
print("11. 综合实战：奖学金评定系统")
print("=" * 50)

student = "王小明"
gpa = 3.8  # 平均绩点
has_award = True  # 是否获奖
volunteer_hours = 80  # 志愿服务时长
is_poor = False  # 是否贫困生

print(f"学生：{student}")
print(f"平均绩点：{gpa}")
print(f"是否获奖：{has_award}")
print(f"志愿时长：{volunteer_hours}小时")
print(f"贫困生：{is_poor}")
print()

# 国家奖学金：GPA>=3.8 且 获奖 且 志愿时长>=60
national_scholarship = gpa >= 3.8 and has_award and volunteer_hours >= 60

# 励志奖学金：贫困生 且 GPA>=3.5 且 志愿时长>=40
inspirational_scholarship = is_poor and gpa >= 3.5 and volunteer_hours >= 40

# 学业奖学金：GPA>=3.5 或（GPA>=3.0 且 获奖）
academic_scholarship = gpa >= 3.5 or (gpa >= 3.0 and has_award)

print("【奖学金评定结果】")
print(f"国家奖学金：{national_scholarship}")
print(f"励志奖学金：{inspirational_scholarship}")
print(f"学业奖学金：{academic_scholarship}")

# 统计可获得的奖学金
scholarships = []
if national_scholarship:
    scholarships.append("国家奖学金")
if inspirational_scholarship:
    scholarships.append("励志奖学金")
if academic_scholarship:
    scholarships.append("学业奖学金")

if scholarships:
    print(f"\n🎉 恭喜！可获得：{' + '.join(scholarships)}")
else:
    print("\n📚 继续加油！暂未达到奖学金标准")

print()

# ==================== 总结 ====================
print("=" * 50)
print("✨ 逻辑运算符总结")
print("=" * 50)
print("""
1. and（与）：
   - 所有条件都为True才返回True
   - 用于"同时满足"的场景
   - 短路特性：遇到False就停止

2. or（或）：
   - 至少一个条件为True就返回True
   - 用于"满足其一"的场景
   - 短路特性：遇到True就停止

3. not（非）：
   - 对条件取反
   - True → False，False → True

💡 优先级：not > and > or

💡 实用技巧：
- 复杂条件使用括号增强可读性
- 利用短路特性避免错误（如除零）
- 结合比较运算符进行复杂判断
- 链式比较更简洁：a < b < c

⚠️ 注意事项：
- and：一假全假
- or：一真全真
- 不要过度嵌套，影响可读性
""")
print("=" * 50)

